package com.ruoyi.client.service;

import com.ruoyi.client.pojo.form.BatchIdsForm;
import com.ruoyi.client.pojo.form.CartAddForm;
import com.ruoyi.client.pojo.form.CartUpdateForm;
import com.ruoyi.client.pojo.vo.CartVo;

import java.util.List;

/**
 * 购物车Service接口
 * 定义购物车核心业务操作，与实现类 ClientCartServiceImpl 一一对应
 */
public interface ClientCartService {

    /**
     * 增加商品至购物车中（已存在则更新数量，不存在则新增）
     * 说明：校验form中goodsId、count非空且数量>0，内部通过userId+goodsId判断是否已存在；
     * 自动校验商品库存，避免超出库存添加
     * @param form 购物车新增表单（含goodsId、count）
     * @return 操作是否成功（true=成功，false=失败）
     */
    Boolean add(CartAddForm form);

    /**
     * 删除购物车中的商品（单个，按购物车项ID）
     * 说明：校验购物车记录归属当前登录用户，避免越权操作
     * @param id 购物车记录ID（shop_cart.id）
     * @return 操作是否成功（true=成功，false=失败）
     */
    Boolean deleteById(Long id);

    /**
     * 批量删除购物车中的商品（按购物车项ID数组）
     * 说明：Form中包含Long[] ids数组，校验ID非空且无null元素；
     * 批量校验记录归属当前用户，存在无权操作记录则抛出异常
     * @param form 批量删除表单（含ids数组）
     * @return 操作是否成功（true=成功，false=失败）
     */
    Boolean deleteBatch(BatchIdsForm form);

    /**
     * 清空当前用户的购物车（按用户ID）
     * 说明：内部获取当前登录用户userId，仅删除该用户的所有购物车记录
     * @return 操作是否成功（true=成功，false=失败）
     */
    Boolean deleteAllByMy();

    /**
     * 更新购物车项（支持数量、勾选状态）
     * 说明：Form中必须包含id（购物车记录ID），count（需>0）、isChecked（0/1）可选；
     * 校验记录归属当前用户，更新数量时校验库存
     * @param form 购物车更新表单（含id，可选count、isChecked）
     * @return 操作是否成功（true=成功，false=失败）
     */
    Boolean update(CartUpdateForm form);

    /**
     * 全选/全不选当前用户的购物车项
     * 说明：isChecked=1表示全选，0表示全不选；内部获取当前登录用户userId
     * @param isChecked 勾选状态（0=未选中，1=选中）
     * @return 操作是否成功（true=成功，false=失败）
     */
    Boolean updateIsCheckedAll(Integer isChecked);

    /**
     * 查询当前用户的所有购物车项
     * 说明：内部获取当前登录用户userId，关联商品表返回详情（含商品名称、价格、图片等）
     * @return 购物车项列表（CartVo集合）
     */
    List<CartVo> listByMy();

    /**
     * 查询当前用户已勾选的购物车项
     * 说明：内部通过userId+isChecked=1查询，关联商品表返回详情，用于结算场景
     * @return 已勾选的购物车项列表（CartVo集合）
     */
    List<CartVo> listIsCheckedByMy();

}